package com.woniu.controller;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.woniu.dto.PayDTO;
import com.woniu.entity.Order;
import com.woniu.entity.OrderItem;
import com.woniu.entity.RawMaterial;
import com.woniu.mapper.OrderItemMapper;
import com.woniu.mapper.OrderMapper;
import com.woniu.mapper.RawMaterialMapper;
import com.woniu.service.ProductService;
import com.woniu.util.PayUtil;
import com.woniu.vo.OrderVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.List;


@Controller
@RequestMapping("/alipay")
@Slf4j
public class AliPayController {
    @Resource
    private PayUtil payUtil;
    @Resource
    private OrderMapper orderMapper;

    @ResponseBody // 将返回值 直接写入 HTTP 响应体（Response Body），作为数据返回（如 JSON、HTML 字符串等）
    @PostMapping("/pay")
    public String alipay(@RequestBody PayDTO payDTO) throws AlipayApiException {
        String outTradeNo = payDTO.getOrderId(); // 订单ID作为支付宝交易号
        OrderVo order = orderMapper.findById(outTradeNo);
        // 添加订单不存在的判断
        if (order == null) {
            return "{\"code\":501,\"data\":null,\"msg\":\"订单不存在，支付失败\"}";
        }
        BigDecimal totalPrice = order.getTotalPrice();
        String totalAmount = totalPrice.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
        String orderName = "订单-" + order.getOrderId();
        /**
         *
         * 参数1：订单号
         * 参数2：订单金额
         * 参数3：订单名称
         *
         */
        return payUtil.sendRequestToAlipay(outTradeNo, Float.valueOf(totalAmount), orderName);
    }

    @Resource
    private RawMaterialMapper rawMaterialMapper;
    @ResponseBody // 将返回值 直接写入 HTTP 响应体（Response Body），作为数据返回（如 JSON、HTML 字符串等）
    @PostMapping("/pay1")
    public String alipay1(@RequestBody PayDTO payDTO) throws AlipayApiException {
        String outTradeNo = String.valueOf(payDTO.getOrderId()); // 订单ID作为支付宝交易号
        RawMaterial rawMaterial = rawMaterialMapper.findByProcureId(outTradeNo);
        // 添加订单不存在的判断
        if (rawMaterial == null) {
            return "{\"code\":501,\"data\":null,\"msg\":\"订单不存在，支付失败\"}";
        }
        BigDecimal totalPrice = rawMaterial.getTotalPrice();
        String totalAmount = totalPrice.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
        String orderName = "采购单号" + rawMaterial.getProcureId();

        /**
         *
         * 参数1：订单号
         * 参数2：订单金额
         * 参数3：订单名称
         *
         */
        return payUtil.sendRequestToAlipay(String.valueOf(outTradeNo), Float.valueOf(totalAmount), orderName);
    }

    //    当我们支付完成之后跳转这个请求并携带参数，我们将里面的订单id接收到，通过订单id查询订单信息，信息包括支付是否成功等
    @GetMapping("/toSuccess")
    public String returns(@RequestParam String out_trade_no) throws ParseException {
        // 1. 查询支付宝交易状态
        String query = payUtil.query(out_trade_no);
        System.out.println("==>" + query);

        JSONObject jsonObject = JSONObject.parseObject(query);
        JSONObject response = jsonObject.getJSONObject("alipay_trade_query_response");

        if (response == null || !"10000".equals(response.getString("code"))) {
            System.out.println("交易查询失败：" + response.getString("sub_msg"));
            return "index"; // 查询失败，跳转首页或其他
        }

        String tradeStatus = response.getString("trade_status");

        if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
            // ✅ 支付成功，更新订单状态

            try {
                if(orderMapper.findById(out_trade_no)!=null){
                    orderMapper.updateOrderStatus(out_trade_no,2);
                }else if(rawMaterialMapper.findByProcureId(out_trade_no)!=null){
                    rawMaterialMapper.updateRwStatus(out_trade_no, 3);
                }
                System.out.println("订单支付成功，订单状态已更新：" + out_trade_no);
            } catch (Exception e) {
                System.err.println("更新订单状态失败：" + e.getMessage());
                // 可以记录日志或发邮件告警
            }

            // 支付成功页面（可自定义）
            return "redirect:http://localhost/payment/success";
        } else {
            // 支付失败或未支付完成 → 恢复库存
            System.out.println("订单支付未成功：" + tradeStatus);
            restoreStockForOrder(out_trade_no);
            return "index";
        }
    }
    @Resource
    private OrderItemMapper orderItemMapper; // 用于查订单项
    @Resource
    private ProductService productService;   // 用于恢复库存（含缓存处理）
    /**
     * 恢复订单商品库存
     */
    private boolean restoreStockForOrder(String orderId) {
        try {
            // 1. 查询订单项
            List<OrderItem> orderItems = orderItemMapper.findOrderDetail(orderId);
            if (orderItems == null || orderItems.isEmpty()) {
                log.warn("订单 {} 没有订单项，无需恢复库存", orderId);
                return true;
            }

            boolean allSuccess = true;

            // 2. 遍历每个商品，增加库存
            for (OrderItem item : orderItems) {
                Integer productId = item.getProductId();
                Integer buyNum = item.getBuyNum();

                if (productId == null || buyNum == null || buyNum <= 0) continue;

                try {
                    // 使用 ProductService 增加库存（自动处理缓存）
                    boolean success = productService.increaseStock(productId, buyNum);
                    if (success) {
                        log.info("✅ 商品ID={} 库存恢复成功：+{} 件", productId, buyNum);
                    } else {
                        log.error("❌ 商品ID={} 库存恢复失败", productId);
                        allSuccess = false;
                    }
                } catch (Exception e) {
                    log.error("恢复商品ID={}库存时异常", productId, e);
                    allSuccess = false;
                }
            }

            return allSuccess;
        } catch (Exception e) {
            log.error("恢复订单 {} 库存时发生异常", orderId, e);
            return false;
        }
    }
}